1 Chargement des données et prise en main

1.1 Chargement

#implantation.dat <- readRDS("data/T0impl.Rds")
# fait.dat <- readRDS("data/T0New.Rds")
fait.dat <- read.csv("data/fait.txt", stringsAsFactors = FALSE) # besoin d'ajouter cela sinon il me garde tous les niveaux des facteurs
implantation.dat <- read.csv("data/implantation.txt")
# une exraction des relations
relation.dat <- fait.dat[fait.dat$caracNew == "Relations" ,]
# on extrait les Déplacements 
relation.dat <- relation.dat[!relation.dat$modaNiv1 == "Déplacement",]

Les données sont regroupées en deux tableaux :

  • “T0impl.Rds” contenant les implantations,
  • “T0New.Rds” contenant les faits.

C’est du second que l’on tire les relations.

1.2 Prise en main

Il faut spécifier les encoding de 3 colonnes qui sont en “Latin1” alors que le reste semble être en UTF8. Au final knitr semble avoir un problème avec du “multi encoding”, j’ai donc fait un export/import le tout en UTF8.

Le tableau 1.1 reprend les nombre de données manquantes par variables. L’absence la plus importante est sur les dates et durée (358) manquantes), puis sur la localisation (109 NA) avec lat/long et granularité et sur les diocèse (11 NA).

# un apply, passer en df qui compte le nombre de NA par colonne 
relation_na.dat <- as.data.frame(apply(relation.dat, 2, function(x)length(x[is.na(x)])))
names(relation_na.dat) <- "Nbr_NA" # on renome puis on fait une deuxième var qui prend les rowname
relation_na.dat$variables <- rownames(relation_na.dat)
rownames(relation_na.dat) <- NULL

# une bidouille pour avoir un titre de tableau avec ref
cat("<tableau>",paste0("<caption>", "(#tab:presenceNa)", ' Nombre de données manquantes par variabes', "</caption>"),"</tableau>", sep ="\n")
Table 1.1: Nombre de données manquantes par variabes

DT::datatable(relation_na.dat) 
#knitr::kable(apply(relation.dat, 2, function(x)length(x[is.na(x)]))) # la version à l'arrache knitr

2 Description des relations

2.1 Modalité des relations

On obtient 3165 factoides avec une relation. Le tableau 2.1 répartit modalite en fonction des modaNiv1. Les relations peuvent être hiérarchiques ou horizontales, dans les cas hiérarchique, elles peuvent être ascendantes et descendantes. Elles peuvent ensuite être ascendantes/descendantes vers une école ou vers un autre type d’implantations. Les relations avec les écoles sont toujours d’appartenance/possession sauf dans un cas ou on est dans une filiation (ascendante/descendante) est ce une erreur de codage avec Filiation ascendante directe / hiérarchique descendante ?

knitr::kable(t(table(relation.dat$modaNiv1 , relation.dat$modalite)),
             caption = "Ventilation de modaNiv1 en fonction de modalité")
Table 2.1: Ventilation de modaNiv1 en fonction de modalité
hiérarchique asc. Ecole hiérarchique ascendante hiérarchique desc. Ecole hiérarchique descendante Relation horizontale
À la collation de 0 199 0 0 0
Appartient à 178 207 0 0 0
Association de prière 0 0 0 0 146
Droit de patronage 0 0 0 199 0
Filiation ascendante directe 1 925 0 0 0
Filiation descendante 0 0 1 924 0
Possède 0 0 178 207 0

2.2 Modalités et relations dans le temps

2.2.1 Exploration des données manquantes dans les dates

Il y a 283 valeurs manquantes au niveau des dates (cf. tableau 1.1). Ces valeurs manquantes ne sont pas consistantes dans les 6 champs de de description des dates. Ce n’est pas important pour moi (olivier) car j’utilise date_startC et date_stopC. Cependant on a 283 date_startC et 273 date_stopC mais on malgré tout 283 DuréeFact est-ce logique ? Puis-je utiliser DuréeFact quand je n’ai pas de date_startC ?

Voici les cas où l’on a une date_stopC et pas de date_startC :

NA_date <- relation.dat[is.na(relation.dat$date_startC),]
knitr::kable(NA_date[!is.na(NA_date$date_stop_max),c(2:4,7,13)]) # attention ici une indexation sur num de colonnes
idfactoid idimplantation usual_name caracNew date_start_max
8039 38936 2743 Saint-Georges-en-Couzan, Saint-Georges (église dépendante) Relations NA
8040 38937 2190 Lyon, Saint-Nizier Relations NA
8124 39023 2792 Saint-Alban, Saint-Alban (église dépendante) Relations NA
8164 39065 1990 Cerdon, Saint-Jean-Baptiste Relations NA
9150 39225 2928 Poitiers, Saint-Hilaire-le-Grand (école interne) Relations NA
9162 39237 2932 Tours, Saint-Martin (école interne) Relations NA
9172 39247 3065 Crépy-en-Valois, Saint-Thomas (école) Relations NA
9329 39022 2651 Poitiers, Saint-Hilaire-le-Grand Relations NA
9341 39133 2966 Tours, Saint-Martin Relations NA
9374 39184 2846 Crépy-en-Valois, Saint-Thomas Relations NA

En regardant la répartition des valeurs manquantes temporelles en fonction de modalite (2.2) on peut remarquer qu’un couple A/D n’est pas complet (60/61). (est ce toujours des couples dans la nouvelle classif ?)

knitr::kable(table(NA_date$modalite), caption = "Répartition des NA temporelles dans les modalité")
Table 2.2: Répartition des NA temporelles dans les modalité
Var1 Freq
À la collation de 60
Appartient à 52
Association de prière 46
Droit de patronage 61
Filiation ascendante directe 6
Filiation descendante 6
Possède 52

On peut produire une carte rapide des valeurs manquantes pour les dates. On en a un gros cluster autour de la région lyonnaise et un autre autour de Charleville-Mézières. Est ce que cela suit une logique par rapport au données ? Avec la version 20191126 on a toujours ces clusters avec en plus des valeurs manquantes mieux réparties sur le territoires.

plot(st_geometry(diocese.shp))
plot(st_geometry(implantation.shp), add =  T, col = "lightgrey", pch = 16, cex = .5)
plot(st_geometry(NA_date.shp), add = T, col = "red", pch = 16, cex = .5)
legend("topleft", legend=c("Avec dates", "Sans date"), pch = 16,
       col=c("lightgrey", "red"))

Et voici une interactive sous mapview : (il y a deux relations qui ne trouve pas d’implantations est ce possible ?)

initmapview()
mapview::mapview(diocese.shp, color = "gray75",  lwd = 1, # couleur et type du contour
                     col.regions = "grey",  alpha = 0.5,                  # couleur du fond et type
                     layer.name = "Diocèses" ) +
mapview::mapview(implantation.shp, cex = 0.1, layer.name = "Implantations") +
mapview::mapview(NA_date.shp, zcol = "modaNiv1", layer.name = "Relations sans dates")
## Warning in validateCoords(lng, lat, funcName): Data contains 1 rows with
## either missing or invalid lat/lon values and will be ignored
## Warning in validateCoords(lng, lat, funcName): Data contains 2 rows with
## either missing or invalid lat/lon values and will be ignored

2.2.2 Dates et durées pour les relations

Je n’ai pas gardé les relations hiérarchique asc. Ecole et hiérarchique ascendante pour les analyses suivantes car elles sont identiques aux descendantes.

Les durées sont produites à partir des fourchettes de dates de début et de fin (date_start_min/max et date_stop_min/max). Il n’y a que trois cas d’écarts importants entre date_start_min et date_start_max représenté par la figure 2.1. Les données manquantes ne sont pas prises en compte. date_stop_min et date_stop_max sont identiques pour les relations.

# c'est du js
f <- list(
  family = "Courier New, monospace",
  size = 18,
  color = "#7f7f7f"
)
x <- list(
  title = "date_start_min",
  titlefont = f
)
y <- list(
  title = "date_start_max",
  titlefont = f
)
# j'enleve les doublons A/D et NA
relation_sans_A.dat <- subset(relation.dat, !(relation.dat$modaNiv1 == "hiérarchique asc. Ecole" | relation.dat$modaNiv1 == "hiérarchique ascendante") )
relation_sans_A.dat <- relation_sans_A.dat[!is.na(relation_sans_A.dat$date_startC),]
# il ignore les NA
plot_ly(relation_sans_A.dat, x = relation_sans_A.dat$date_start_min, y = relation_sans_A.dat$date_start_max, type="scatter", # on def X et y
        # on fait un text
        text = paste(relation_sans_A.dat$usual_name, relation_sans_A.dat$modalite, relation_sans_A.dat$linked_implantation, sep = "\n")) %>% 
layout(xaxis = x, yaxis = y)

Figure 2.1: Écarts entre date_start_min et date_start_max

La figure 2.2 regroupe les répartitions des dates (par tranches de 50 ans) de début et fin des modes d’agrégations. Avec ce grain, assez grossier, on peut noter un premier pic dans les dates de relation autour 1100 pour les relations A/D (penser à détailler cette agrégation), suivit d’un second pic de début de relation autour de 1300 qui n’est rattrapé en fin de relation qu’en 1750-1800. Il y a deux pics de dates de début/fin pour les associations de prières (H) le premier autour de 1250-1300 et le second autour de 1400 pour le début puis 1450 pour la fin.

# on va utiliser ggplot2 donc il faut que cela soit en tidy, au moins un peu
relation_sans_NA_tidy.dat <- gather(relation_sans_A.dat, "date_startC", "date_stopC", key = "debut_fin", value = "date")
# date de début et de fin des relation par modAgreg
date_modalite <- ggplot(relation_sans_NA_tidy.dat, aes(date, color = debut_fin)) +
    geom_freqpoly(binwidth = 50) + 
    facet_wrap(~modaNiv1) +
    labs(x = "", y = "") +
    theme_bw()
# c'est du js
f <- list(
  family = "Courier New, monospace",
  size = 18,
  color = "#7f7f7f"
)
x <- list(
  title = "date (50 ans)",
  titlefont = f
)
y <- list(
  title = "décompte",
  titlefont = f
)
ggplotly(date_modalite) %>% 
    layout(xaxis = x, yaxis = y)

Figure 2.2: Répartition des dates (début/fin) par tranches de 50 ans en fonction des modes d’agrégation

En plus des 273-283 valeurs manquantes il y 878 durées nulles (DureeFact == 0). Est-il possible que ces durées soit inférieures à notre grain temporelle (une année) ?

Il y a 612 durées de plus d’un an.

le tableau 2.3 représente la répartition des durées nulles par modalités. Le droit de patronage, l’association de prière et la possession restent dans des proportions similaires entre les deux catégories (0/1) par Filiation descendante semble proportionnellement moins souvent représentés par des durées (notre olivier : je n’ai pas fait de chi2 ni de comparaison multiple est-ce utile/nécessaire ?).

relation_sans_A.dat$modalite <- factor(relation_sans_A.dat$modalite) # on recode pour dropper les niveau du facteur absent
# une variable pour séparer ceux qui ont une durée des autres
relation_sans_A.dat$durée01 <- 0
relation_sans_A.dat$durée01[relation_sans_A.dat$DureeFact != 0] <- 1

knitr::kable(table(relation_sans_A.dat$modalite, relation_sans_A.dat$durée01), caption = "Répartition des durées nulles (0) ou supérieures à 1 (1) par modalités") # puis un tableau
Table 2.3: Répartition des durées nulles (0) ou supérieures à 1 (1) par modalités
0 1
Association de prière 56 44
Droit de patronage 71 67
Filiation descendante 584 335
Possède 167 166

La figure 2.3 correspond aux distribution des durées en fonction des modalités de relation. On a des durées négatives.

f <- list(
  family = "Courier New, monospace",
  size = 18,
  color = "#7f7f7f"
)

y <- list(
  title = "Durée (années)",
  titlefont = f
)
relation_duree.dat <- relation_sans_A.dat[relation_sans_A.dat$DureeFact != 0,]

plot_ly(relation_duree.dat, y = ~DureeFact, color = ~modalite, type = "box",
        text = paste(relation_duree.dat$usual_name, relation_duree.dat$modalite, relation_duree.dat$linked_implantation, sep = "\n")) %>% 
layout(yaxis = y)

Figure 2.3: Boites à moustaches des durées en fonction des modalités de relation